home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / pibt3sp3.arc / PIBTERM.PAS < prev    next >
Pascal/Delphi Source File  |  1985-10-04  |  45KB  |  1,021 lines

  1. (*$C-,V-,U-,R-,K-*)
  2. PROGRAM PibTerm;
  3.  
  4. (*----------------------------------------------------------------------*)
  5. (*               PibTerm --- Terminal Emulator in Turbo Pascal          *)
  6. (*----------------------------------------------------------------------*)
  7. (*                                                                      *)
  8. (*  Author:   (c) 1985 by Philip R. Burns                               *)
  9. (*                                                                      *)
  10. (*  Date:     October, 1985                                             *)
  11. (*  Version:  1.0  (January, 1985)                                      *)
  12. (*            2.0  (July, 1985)                                         *)
  13. (*            3.0  (October, 1985)                                      *)
  14. (*  Systems:  For MS-DOS on IBM PCs and close compatibles only.         *)
  15. (*            Note:  I have checked these on Zenith 151s under          *)
  16. (*                   MSDOS 2.1 and IBM PCs under PCDOS 2.0.             *)
  17. (*                                                                      *)
  18. (*  Overview: This program provides a comprehensive terminal emulation  *)
  19. (*            and remote communications facility.  PibTerm emulates     *)
  20. (*            five different types of terminals:                        *)
  21. (*                                                                      *)
  22. (*               (1)  Dec VT52                                          *)
  23. (*               (2)  Dec VT100 (ANSI)                                  *)
  24. (*               (3)  BBS ANSI (DEC private codes not interpreted)      *)
  25. (*               (4)  Dumb "glass" TTY                                  *)
  26. (*               (5)  Split-screen dumb-terminal mode                   *)
  27. (*                                                                      *)
  28. (*            PibTerm allows for file transfer facilities using         *)
  29. (*            several different protocols:                              *)
  30. (*                                                                      *)
  31. (*               (1)  Ascii capture                                     *)
  32. (*               (2)  Xmodem checksum and CRC                           *)
  33. (*               (3)  Modem7                                            *)
  34. (*               (4)  Telink                                            *)
  35. (*               (5)  Ymodem                                            *)
  36. (*               (6)  Kermit                                            *)
  37. (*               (7)  CompuServe B                                      *)
  38. (*                                                                      *)
  39. (*            The commands and general program use follow that of the   *)
  40. (*            popular PC-TALK and QMODEM programs.                      *)
  41. (*                                                                      *)
  42. (*            PibTerm also provides a simple host communications        *)
  43. (*            facility like a mini-BBS.                                 *)
  44. (*                                                                      *)
  45. (*----------------------------------------------------------------------*)
  46. (*                                                                      *)
  47. (*                            Restriction                               *)
  48. (*                            -----------                               *)
  49. (*                                                                      *)
  50. (*           You may use this code only for NON COMMERCIAL purposes     *)
  51. (*           unless you explicitly obtain my permission.  I take a dim  *)
  52. (*           view of others making money on my work and those of other  *)
  53. (*           people whose code I've inserted here.                      *)
  54. (*                                                                      *)
  55. (*           Please feel free to add new features.  I wrote this        *)
  56. (*           program to give people a useful and usable basic terminal  *)
  57. (*           facility, and to show how Turbo Pascal can be used for     *)
  58. (*           asynchronous communications, menu display, windowing, and  *)
  59. (*           so on.  I hope that you find this program useful -- and,   *)
  60. (*           if you expand upon it, please upload your extensions so    *)
  61. (*           that all of us can enjoy them!                             *)
  62. (*                                                                      *)
  63. (*----------------------------------------------------------------------*)
  64. (*                                                                      *)
  65. (*           Suggestions for improvements or corrections are welcome.   *)
  66. (*           Please leave messages on Gene Plantz's BBS (312) 882 4145  *)
  67. (*           or Ron Fox's BBS (312) 940 6496.                           *)
  68. (*                                                                      *)
  69. (*----------------------------------------------------------------------*)
  70.  
  71. (*$IGLOBTYPE.PAS *)
  72. (*$IASCII.PAS    *)
  73.  
  74. (*----------------------------------------------------------------------*)
  75. (*                   GLOBAL VARIABLE DEFINITIONS                        *)
  76. (*----------------------------------------------------------------------*)
  77.  
  78. CONST
  79.    Pibterm_Version = '3.0 (October, 1985)' (* Version no. of PibTerm    *);
  80.    Max_Screen_Col  = 80                      (* PC's screen width       *);
  81.  
  82. (*----------------------------------------------------------------------*)
  83. (*                   PibTerm Command Types                              *)
  84. (*----------------------------------------------------------------------*)
  85.  
  86. CONST
  87.    No_Of_PibTerm_Commands           = 57;
  88.    No_Of_Pibterm_Commands_Minus_One = 56;
  89.  
  90. TYPE
  91.    PibTerm_Command_Type = ( AddLFSy,     AreaCodeSy,  BreakSy,    CaptureSy,
  92.                             CaseSy,
  93.                             ClearSy,     DelaySy,     DialSy,     DosSy,
  94.                             EchoSy,      EditSy,      ElseSy,     EndCaseSy,
  95.                             EndIfSy,     EndWhileSy,  ExitSy,     FastCSy,
  96.                             FileSy,      GossipSy,    GoToSy,     HangUpSy,
  97.                             HostSy,      IfConSy,     IfFoundSy,  IfLocStrSy,
  98.                             IfRemStrSy,  InfoSy,      InputSy,
  99.                             KeySendSy,   KeySy,       LabelSy,    LogSy,
  100.                             MessageSy,   MuteSy,      OtherSy,    ParamSy,
  101.                             QuitSy,
  102.                             ReceiveSy,   ReDialSy,    RepeatSy,   ResetSy,
  103.                             RInputSy,    SDumpSy,     SendSy,     STextSy,
  104.                             SuspendSy,   TextSy,
  105.                             TimersSy,    TranslateSy, UntilSy,    ViewSy,
  106.                             WaitSy,      WaitStrSy,   WhenSy,     WhileSy,
  107.                             Bad_Command, Null_Command
  108.                           );
  109.  
  110.                                    (* Command to be executed *)
  111. VAR
  112.    PibTerm_Command : PibTerm_Command_Type;
  113.  
  114.                                    (* Conversion table from input to *)
  115.                                    (* commands.                      *)
  116. VAR
  117.    PibTerm_Command_Table : ARRAY[0..255] OF PibTerm_Command_Type;
  118.  
  119.  
  120. (*----------------------------------------------------------------------*)
  121. (*                      Timing constants                                *)
  122. (*----------------------------------------------------------------------*)
  123.  
  124. CONST
  125.    One_Second_Delay        = 1000  (* Delay argument for 1 second delay *);
  126.    Two_Second_Delay        = 2000  (* Delay argument for 2 second delay *);
  127.    Three_Second_Delay      = 3000  (* Delay argument for 3 second delay *);
  128.    Tenth_of_a_second_Delay = 100   (* 1/10 second delay                 *);
  129.  
  130. VAR
  131.    Delay_Time : INTEGER;           (* Time to delay in response to DELAY *)
  132.                                    (* command                            *)
  133.  
  134. (*----------------------------------------------------------------------*)
  135. (*                          Text/Menu Colors                            *)
  136. (*----------------------------------------------------------------------*)
  137.  
  138. VAR
  139.    ForeGround_Color : INTEGER      (* Color for ordinary text           *);
  140.    BackGround_Color : INTEGER      (* Usual background color            *);
  141.  
  142.    Menu_Text_Color  : INTEGER      (* Color for menu text               *);
  143.    Menu_Frame_Color : INTEGER      (* Color for menu frame              *);
  144.  
  145.    Text_Mode        : INTEGER      (* Text mode for all text            *);
  146.    Blinking_On      : INTEGER      (* >0 if blinking turned on          *);
  147.  
  148. (*----------------------------------------------------------------------*)
  149. (*                    VT100 emulation colors                            *)
  150. (*----------------------------------------------------------------------*)
  151.  
  152.    VT100_ForeGround_Color : INTEGER  (* VT100 foreground color         *);
  153.    VT100_BackGround_Color : INTEGER  (* VT100 background color         *);
  154.    VT100_Underline_Color  : INTEGER  (* VT100 foreground color         *);
  155.    VT100_Bold_Color       : INTEGER  (* VT100 background color         *);
  156.  
  157. (*----------------------------------------------------------------------*)
  158. (*                      Program Option Flags                            *)
  159. (*----------------------------------------------------------------------*)
  160.  
  161. VAR
  162.    Local_Echo          : BOOLEAN   (* Local Echo ON/OFF                 *);
  163.    BS_Char             : CHAR      (* CHAR to send when Back Space hit  *);
  164.    Ctrl_BS_Char        : CHAR      (* CHAR to send when CTRL BS hit     *);
  165.    Silent_Mode         : BOOLEAN   (* TRUE to suppress bells, music.    *);
  166.    Printer_On          : BOOLEAN   (* Echo to printer                   *);
  167.    Capture_On          : BOOLEAN   (* Capture mode on                   *);
  168.    Translate_On        : BOOLEAN   (* Translate mode on                 *);
  169.    Ansi_Graphics_On    : BOOLEAN   (* If ansi graphics mode on          *);
  170.    Add_LF              : BOOLEAN   (* Add line feeds to incoming lines  *);
  171.    Play_Music_On       : BOOLEAN   (* Play music if found               *);
  172.    Pibterm_Done        : BOOLEAN   (* Finished running PibTerm          *);
  173.    Gossip_Mode_On      : BOOLEAN   (* Split-screen gossip mode          *);
  174.    Reset_Comm_Port     : BOOLEAN   (* TRUE to reset comm port           *);
  175.    Comm_Port_Changed   : BOOLEAN   (* TRUE if comm port number changed  *);
  176.    Host_Mode           : BOOLEAN   (* TRUE if PibTerm in host mode      *);
  177.    Last_Column_Hit     : BOOLEAN   (* TRUE if col 80 hit in display     *);
  178.    Auto_Wrap_Mode      : BOOLEAN   (* TRUE for autowrap on long lines   *);
  179.    Exploding_Menus     : BOOLEAN   (* TRUE to use exploding menus       *);
  180.    Review_On           : BOOLEAN   (* TRUE if review buffer used        *);
  181.    Script_File_Mode    : BOOLEAN   (* TRUE if currently exec'ing script *);
  182.    CompuServe_B_On     : BOOLEAN   (* CompuServe B protocol in VT52     *);
  183.    Mahoney_On          : BOOLEAN   (* Mahoney BBS codes allowed in VT52 *);
  184.    When_Mode           : BOOLEAN   (* TRUE if WHEN string defined       *);
  185.    WaitString_Mode     : BOOLEAN   (* TRUE if WAITSTRING string defined *);
  186.    Read_In_Script      : BOOLEAN   (* TRUE to read in script            *);
  187.    Really_Wait_String  : BOOLEAN   (* TRUE to really wait for string    *);
  188.  
  189. (*----------------------------------------------------------------------*)
  190. (*                           Global files                               *)
  191. (*----------------------------------------------------------------------*)
  192.  
  193. TYPE
  194.    Text_File      = TEXT [512]     (* General text file                 *);
  195.  
  196. VAR
  197.    Config_File    : Text_File      (* Global configuration file         *);
  198.    Capture_File   : Text_File      (* Capture file                      *);
  199.    Xfer_List_File : Text_File      (* File transfer list file           *);
  200.    Command_File   : Text_File      (* Command file                      *);
  201.    Script_File    : Text_File      (* Script file                       *);
  202.  
  203.    Capture_File_Name : FileStr     (* Capture file name                 *);
  204.  
  205.    Home_Dir_Path     : FileStr     (* Home Directory Path for PibTerm   *);
  206.    Home_Dir          : FileStr     (* Home Directory for PibTerm        *);
  207.    Home_Drive        : CHAR        (* Home Drive Letter for PibTerm     *);
  208.  
  209.    Screen_Dump_Name  : FileStr     (* Screen dump file name             *);
  210.    Script_File_Name  : FileStr     (* Script file name                  *);
  211.  
  212. (*----------------------------------------------------------------------*)
  213. (*                         Review buffer                                *)
  214. (*----------------------------------------------------------------------*)
  215.  
  216. TYPE
  217.    Review_Buffer_Type = ARRAY[1..1] OF STRING[80];
  218.    Review_Buffer_Ptr  = ^Review_Buffer_Type;
  219.  
  220. VAR
  221.    Max_Review_Length : INTEGER     (* Number of lines in review buffer *);
  222.  
  223.                                    (* Review buffer pointer *)
  224.    Review_Buffer:  Review_Buffer_Ptr;
  225.  
  226.    Review_Line  :  AnyStr          (* Current line                      *);
  227.    Review_Head  :  INTEGER         (* Head of review buffer             *);
  228.    Review_Tail  :  INTEGER         (* Tail of review buffer             *);
  229.  
  230. (*----------------------------------------------------------------------*)
  231. (*                   Incoming/Outgoing key definitions                  *)
  232. (*----------------------------------------------------------------------*)
  233.  
  234.                                    (* Keypad key strings                *)
  235.  
  236.    Keypad_Keys      : ARRAY[1..3] OF ARRAY[1..10] OF STRING[12];
  237.  
  238.                                    (* Maps input key to Keypad_Key      *)
  239.  
  240.    Keypad_Key_Index : ARRAY[0..255] OF BYTE;
  241.  
  242.                                    (* Keypad key names                  *)
  243.  
  244.    Keypad_Key_Names : ARRAY[1..3] OF ARRAY[1..10] OF STRING[4];
  245.  
  246.                                    (* Function key definitions          *)
  247.  
  248.    Function_Keys    : ARRAY[1..4] OF ARRAY[1..10] OF KeyStr;
  249.  
  250.    Key_No           : INTEGER      (* Key number to execute             *);
  251.  
  252.    FK_CR        : CHAR             (* Function key definition CR        *);
  253.    FK_Delay     : CHAR             (* Function key def. 1 second wait   *);
  254.    FK_Wait_For  : CHAR             (* Function key wait for next char   *);
  255.    FK_Ctrl_Mark : CHAR             (* Marks next char as ctrl character *);
  256.  
  257.                                    (* Incoming character translate table *)
  258.    TrTab        : ARRAY[CHAR] OF CHAR;
  259.  
  260. (*----------------------------------------------------------------------*)
  261. (*               Global communications variables                        *)
  262. (*----------------------------------------------------------------------*)
  263.  
  264. VAR
  265.    Data_Bits   : 5..8;
  266.    Parity      : CHAR;
  267.    Stop_Bits   : 0..2;
  268.    Comm_Port   : 1..2;
  269.    Baud_Rate   : 110..9600;
  270.  
  271. (*----------------------------------------------------------------------*)
  272. (*          Global variables for view file/directory/area codes         *)
  273. (*----------------------------------------------------------------------*)
  274.  
  275. VAR
  276.    View_Count     : INTEGER;
  277.    View_Line      : STRING[128];
  278.    View_Done      : BOOLEAN;
  279.    View_Char      : STRING[1];
  280.    View_Y         : INTEGER;
  281.  
  282. (*----------------------------------------------------------------------*)
  283. (*           Types and Variables for Terminal Emulation Facilities      *)
  284. (*----------------------------------------------------------------------*)
  285.  
  286. TYPE
  287.    Terminal_Type = ( Dumb, VT52, Ansi, VT100, Gossip, HostMode );
  288.  
  289. VAR
  290.                                    (* Type of terminal to emulate      *)
  291.    Terminal_To_Emulate : Terminal_Type;
  292.  
  293.                                    (* Saves previous term. type        *)
  294.    Saved_Gossip_Term   : Terminal_Type;
  295.  
  296.  
  297. (*----------------------------------------------------------------------*)
  298. (*           Global variables for phone directory handling              *)
  299. (*----------------------------------------------------------------------*)
  300.  
  301. CONST
  302.    Max_Phone_Prefixes        = 5;
  303.    Max_Dial_Numbers          = 5;
  304.    Default_Phone_Number_Size = 200;
  305.  
  306. (* STRUCTURED *) CONST
  307.    Phone_Prefix_Chars   : ARRAY[ 1 .. Max_Phone_Prefixes ] OF CHAR
  308.                           = ( '+', '-', '!', '@', '#' );
  309.  
  310. TYPE
  311.  
  312.    Char_25  = PACKED ARRAY[ 1 .. 25 ] OF CHAR;
  313.    Char_15  = PACKED ARRAY[ 1 .. 15 ] OF CHAR;
  314.    Char_5   = PACKED ARRAY[ 1 .. 5  ] OF CHAR;
  315.    Char_2   = PACKED ARRAY[ 1 .. 2  ] OF CHAR;
  316.  
  317.    String30 = STRING[30];
  318.  
  319.                                    (* Dialing file entry *)
  320.    Phone_Number_Record = RECORD
  321.                             Phone_Name:     Char_25;
  322.                             Phone_Number:   Char_15;
  323.                             Phone_Baud:     Char_5;
  324.                             Phone_Parity:   CHAR;
  325.                             Phone_DataBits: CHAR;
  326.                             Phone_StopBits: CHAR;
  327.                             Phone_ENDer   : Char_2;
  328.                          END;
  329.  
  330.                                    (* Dialing file       *)
  331.  
  332.    Phone_File_Type = FILE OF Phone_Number_Record;
  333.  
  334.  
  335. VAR
  336.                                    (* Phone directory file *)
  337.    Phone_File          : Phone_File_Type;
  338.  
  339.                                    (* Current phone entry data *)
  340.    Phone_Entry_Data    : Phone_Number_Record;
  341.  
  342.                                    (* Current phone record number *)
  343.    Phone_Entry_Number  : INTEGER;
  344.                                    (* Current phone page number   *)
  345.    Phone_Entry_Page    : INTEGER;
  346.                                    (* File with phone prefixes    *)
  347.    Phone_Prefix_File   : Text_File;
  348.                                    (* Phone prefixes numbers      *)
  349.    Phone_Prefix_Nos    : ARRAY[ 1 .. Max_Phone_Prefixes ] OF ShortStr;
  350.  
  351.    Default_Prefix      : CHAR      (* Default prefix character    *);
  352.    Phone_Number        : String30  (* Phone number to dial        *);
  353.    Prefix_Str          : ShortStr  (* Phone number prefix         *);
  354.  
  355.    Modem_Init          : ShortStr  (* Modem initialization string *);
  356.  
  357.    Modem_Dial          : ShortStr  (* Modem dialing command       *);
  358.    Modem_Busy          : ShortStr  (* Modem return if line busy   *);
  359.    Modem_Connect       : ShortStr  (* Modem connect message       *);
  360.    Modem_No_Carrier    : ShortStr  (* Modem no carrier message    *);
  361.    Modem_Escape        : ShortStr  (* Modem escape command        *);
  362.    Modem_Escape_Time   : INTEGER   (* Time in mil. for escape     *);
  363.    Modem_Hang_Up       : ShortStr  (* Modem hangup command        *);
  364.    Modem_Time_Out      : REAL      (* Modem time out value        *);
  365.    Modem_Redial_Delay  : REAL      (* Modem redial delay          *);
  366.    Modem_Answer        : ShortStr  (* Modem answer phone          *);
  367.    Modem_Host_Set      : ShortStr  (* Modem host mode setup       *);
  368.    Modem_Command_Delay : INTEGER   (* Ms between command chars    *);
  369.    Modem_Carrier_High  : BOOLEAN   (* TRUE if carrier line high   *);
  370.    Host_Auto_Baud      : BOOLEAN   (* Attempt auto speed detect   *);
  371.  
  372. (*----------------------------------------------------------------------*)
  373. (*                 Global variables for music playing                   *)
  374. (*----------------------------------------------------------------------*)
  375.  
  376. VAR
  377.                                    (* Current Octave for Note *)
  378.    Note_Octave   : INTEGER;
  379.                                    (* Fraction of duration given to note *)
  380.    Note_Fraction : REAL;
  381.                                    (* Duration of note *)
  382.    Note_Duration : INTEGER;
  383.                                    (* Length of note *)
  384.    Note_Length   : REAL;
  385.                                    (* Length of quarter note (principal beat) *)
  386.    Note_Quarter  : REAL;
  387.  
  388. (*----------------------------------------------------------------------*)
  389. (*                 Global variables for file transfers                  *)
  390. (*----------------------------------------------------------------------*)
  391.  
  392. CONST
  393.                    (* Special characters used in XMODEM *)
  394.  
  395.    SOH   = $01;                    (* Start of XMODEM block       *)
  396.    STX   = $02;                    (* Start of Ymodem block       *)
  397.    EOT   = $04;                    (* End of XMODEM transmission  *)
  398.    ACK   = $06;                    (* Acknowledge an XMODEM block *)
  399.    NAK   = $15;                    (* Refuse an XMODEM block      *)
  400.    SYN   = $16;                    (* Start of Telink header      *)
  401.    CAN   = $18;                    (* Cancel XMODEM transfer      *)
  402.  
  403. TYPE
  404.    Sector_Type             = ARRAY[ 1 .. 1026 ] OF BYTE;
  405.    File_Handle_Buffer_Type = ARRAY[ 1 .. 2048 ] OF BYTE;
  406.    File_Handle_Buffer_Ptr  = ^File_Handle_Buffer_Type;
  407.  
  408. VAR
  409.    Sector_Size      : INTEGER      (* Size of Xmodem sector             *);
  410.  
  411.                                    (* One sector of data                *)
  412.    Sector_Data      : Sector_Type;
  413.  
  414.    Sector_Number    : INTEGER      (* Current sector number being sent  *);
  415.  
  416.    Max_Write_Buffer : INTEGER      (* Download buffer size              *);
  417.  
  418.  
  419.                    (* Transfer Declarations *)
  420. TYPE
  421.  
  422.    Transfer_Type = ( Ascii, Xmodem_Chk, Xmodem_CRC, Kermit, Telink,
  423.                      Modem7_Chk, Modem7_CRC, Ymodem, Ymodem_Batch, None );
  424.  
  425.    Transfer_Str  = STRING[255];
  426.  
  427. CONST
  428.    Max_Transfer_Types = 10;
  429.  
  430. (* STRUCTURED *) CONST
  431.    Transfers : ARRAY[ 1 .. Max_Transfer_Types ] OF Transfer_Type
  432.                = ( Ascii, Xmodem_Chk, Xmodem_Crc, Kermit, Telink,
  433.                    Modem7_Chk, Modem7_CRC, Ymodem, Ymodem_Batch, None );
  434.  
  435.                    (* Files for transfers *)
  436. VAR
  437.  
  438.    AFile        : TEXT [4096]      (* Ascii File uploaded/downloaded    *);
  439.    XFile_Handle : INTEGER          (* Xmodem File uploaded/downloaded   *);
  440.    FileName     : STRING[64]       (* Name of file                      *);
  441.  
  442.  
  443.                    (* Timing/Delay Constants and Variables *)
  444. CONST
  445.  
  446.    One_Second     =  1              (* One second                       *);
  447.    Two_Seconds    =  2              (* Two seconds                      *);
  448.    Five_Seconds   =  5              (* Five seconds                     *);
  449.    Ten_Seconds    = 10              (* Ten seconds                      *);
  450.    Twenty_Seconds = 20              (* Twenty seconds                   *);
  451.    Sixty_Seconds  = 60              (* Sixty seconds                    *);
  452.    Trans_Time_Val = 1800.0          (* Fudge factor for transfer times  *);
  453.  
  454. VAR
  455.  
  456.    Char_Delay  : INTEGER            (* Character delay for Ascii trans.  *);
  457.    Line_Delay  : INTEGER            (* Line delay for Ascii transfers    *);
  458.    Pacing_Char : CHAR               (* Pacing character for uploads      *);
  459.    CR_LF_String: STRING[2]          (* CR or CR+LF to end ASCII lines    *);
  460.  
  461.                    (* Save/restore transmission params during XMODEM *)
  462.  
  463. VAR
  464.    Xmodem_Bits_Save:   INTEGER     (* Save # bits per character         *);
  465.    Xmodem_Parity_Save: CHAR        (* Save parity                       *);
  466.    Xmodem_Stop_Save:   INTEGER     (* Save stop bits                    *);
  467.  
  468. VAR                                (* Default transfer type             *)
  469.    Default_Transfer_Type : Transfer_Type;
  470.  
  471. VAR
  472.    Stop_Receive  : BOOLEAN         (* TRUE to cancel receiving of file. *);
  473.    Stop_Send     : BOOLEAN         (* TRUE to cancel sending of file.   *);
  474.    Use_Time_Sent : BOOLEAN         (* TRUE to stamp file with received  *)
  475.                                    (* time and date.                    *);
  476.    Null_File_Name: BOOLEAN         (* TRUE if null file name in Ymodem  *);
  477.  
  478. VAR
  479.    GMT_Difference: INTEGER         (* Difference in hours between local *)
  480.                                    (* time and Greenwich mean time      *);
  481. VAR
  482.    Transfer_Bells: INTEGER         (* Number of bells after transfer    *);
  483.  
  484. (*----------------------------------------------------------------------*)
  485. (*              Definitions for Kermit protocol transfers               *)
  486. (*----------------------------------------------------------------------*)
  487.  
  488. TYPE
  489.  
  490.    Kermit_Packet_String = STRING[150];
  491.  
  492.    Kermit_State_Vars = ( Send_Init,      Send_File_Header,  Send_File,
  493.                          Send_EOF,       Send_Break,        Receive_Init,
  494.                          Receive_Header, Receive_File,      Send_Bye,
  495.                          Get_File );
  496.  
  497.    Kermit_File_Param   = ( Kermit_Ascii, Kermit_Binary, Kermit_None );
  498.  
  499.    Kermit_Packet_Param = ( Break_Pack,  Data_Pack, Error_Pack,
  500.                            Header_Pack, NAK_Pack,  Send_Pack, Reserved_Pack,
  501.                            ACK_Pack,    End_Pack,  Unknown );
  502.  
  503.    Kermit_File_Modes   = ( Read_Open, Write_Open );
  504.  
  505.  
  506. CONST
  507.    Kermit_Init_Packet_Size = 94;
  508.  
  509. VAR
  510.                                    (* Type of file (Ascii, Binary) *)
  511.  
  512.    Kermit_File_Type_Var : Kermit_File_Param;
  513.  
  514.                                    (* Type of current Kermit packet *)
  515.  
  516.    Kermit_Packet_Type   : Kermit_Packet_Param;
  517.  
  518.                                    (* Current state of Kermit transfer *)
  519.  
  520.    Kermit_State         : Kermit_State_Vars;
  521.  
  522.                                    (* If remote kermit in server mode *)
  523.    Kermit_Remote_Server : BOOLEAN;
  524.  
  525.    Kermit_Packet_Size   : INTEGER  (* Size of current packet *);
  526.    Kermit_Timeout       : INTEGER  (* Timeout value in seconds *);
  527.    His_TimeOut          : INTEGER  (* Timeout desired by remote *);
  528.    Kermit_Npad          : INTEGER  (* Number of padding characters *);
  529.    Kermit_EOL           : CHAR     (* End of line character *);
  530.    Kermit_Header_Char   : CHAR     (* Block header character *);
  531.  
  532.    Kermit_Pad_Char      : CHAR     (* Padding character *);
  533.    Kermit_Quote_Char    : CHAR     (* Control-quote character *);
  534.    Kermit_Quote_8_Char  : CHAR     (* 8-bit quoting character *);
  535.    Kermit_Chk_Type      : CHAR     (* Block-check type        *);
  536.    Kermit_Repeat_Char   : CHAR     (* Repeat character        *);
  537.  
  538.                                    (* Packet buffer area       *)
  539.  
  540.    Packet_Buffer      : Kermit_Packet_String;
  541.  
  542.                                    (* Complete packet to send  *)
  543.  
  544.    Packet_Buffer_Data : Kermit_Packet_String;
  545.  
  546.                                    (* Complete packet received *)
  547.  
  548.    Rec_Packet         : Kermit_Packet_String;
  549.  
  550.    Packet_OK          : BOOLEAN    (* TRUE if packet OK        *);
  551.    Ack_OK             : BOOLEAN    (* TRUE if packet ACK'd     *);
  552.    Open_OK            : BOOLEAN    (* TRUE if file to transfer opened OK *);
  553.    File_Done          : BOOLEAN    (* TRUE if file being sent done *);
  554.    Kermit_Abort       : BOOLEAN    (* TRUE if keyboard entry aborts transfer *);
  555.    Kermit_Retry       : BOOLEAN    (* TRUE to retry current packet *);
  556.  
  557.    Packet_Num         : INTEGER    (* Packet number being sent *);
  558.    Rec_Packet_Num     : INTEGER    (* Received packet number *);
  559.    Packets_Sent       : INTEGER    (* Number of packets sent *);
  560.    Packets_Received   : INTEGER    (* Number of packets received *);
  561.    Packets_Bad        : INTEGER    (* Number of errors in transfer *);
  562.  
  563.    File_Open          : BOOLEAN    (* TRUE if file being transferred is open *);
  564.  
  565.                                    (* Received file data *)
  566.  
  567.    Received_Data      : Kermit_Packet_String;
  568.  
  569.    Quoting            : BOOLEAN    (* TRUE if 8th-bit quoting in effect *);
  570.    Repeating          : BOOLEAN    (* TRUE if repeating/compression in effect *);
  571.    Sending_File       : BOOLEAN    (* TRUE if uploading, FALSE if downloading *);
  572.    Logging_Out_Server : BOOLEAN    (* TRUE if logging out remote server       *);
  573.  
  574.    My_Pad_Char        : CHAR       (* Default pad character *);
  575.    His_Quote_Char     : CHAR       (* Remote kermit's quote character *);
  576.    His_Quote_8_Char   : CHAR       (* Remote kermit's 8th-bit quote character *);
  577.    His_Chk_Type       : CHAR       (* Remote kermit's block check type *);
  578.  
  579.    My_Pad_Num         : INTEGER    (* Default number of padding characters *);
  580.    Send_EOL           : INTEGER    (* Send CR first time *);
  581.  
  582.    File_Records       : REAL       (* Number of bytes in disk file *);
  583.    FilePointer        : INTEGER    (* Where we are in the record *);
  584.    Buffer_Num         : REAL       (* How many characters read/written *);
  585.    Kermit_Delay_Time  : INTEGER    (* Time to wait before send in host mode *);
  586.    Receive_Done       : BOOLEAN    (* TRUE if file reception complete *);
  587.    Kermit_MaxTry      : INTEGER    (* Maximum number of retries allowed *);
  588.  
  589.                                  (* TRUE to turn off remote Kermit server *)
  590.  
  591.    Finish_Kermit_Server : BOOLEAN;
  592.  
  593.                                  (* TRUE if Kermit in debug mode *)
  594.  
  595.    Kermit_Debug         : BOOLEAN;
  596.  
  597. (*----------------------------------------------------------------------*)
  598. (*                    Global script file variables                      *)
  599. (*----------------------------------------------------------------------*)
  600.  
  601. CONST
  602.    Max_Script_File_Commands = 44;
  603.  
  604. (* STRUCTURED *) CONST
  605.                                    (* Valid command names for scripts *)
  606.  
  607.    Script_File_Command_Names : ARRAY[1..Max_Script_File_Commands] OF STRING[8]
  608.                              = ( 'ADDLF',    'BREAK',    'CAPTURE',  'CASE',
  609.                                  'CLEAR',    'DELAY',    'DIAL',
  610.                                  'DOS',      'ECHO',     'ELSE',     'ENDCASE',
  611.                                  'ENDIF',
  612.                                  'ENDWHILE', 'EXIT',     'FILE',     'GOTO',
  613.                                  'HANGUP',
  614.                                  'HOST',     'IF',       'INPUT',    'KEY',
  615.                                  'KEYSEND',
  616.                                  'LABEL',    'LOG',      'MESSAGE',  'MUTE',
  617.                                  'OTHERWIS',
  618.                                  'PARAM',    'RECEIVE',  'REDIAL',   'REPEAT',
  619.                                  'RESET',    'RINPUT',   'SCREENDUM','SEND' ,
  620.                                  'STEXT',    'SUSPEND',  'TEXT',     'TRANSLAT',
  621.                                  'UNTIL',
  622.                                  'WAIT',     'WAITSTRI', 'WHEN',     'WHILE' );
  623.  
  624.                                    (* Corresponding command types *)
  625.  
  626.    Script_File_Commands      : ARRAY[1..Max_Script_File_Commands] OF
  627.                                PibTerm_Command_Type =
  628.                                ( AddLFSy,     BreakSy,    CaptureSy,  CaseSy,
  629.                                  ClearSy,     DelaySy,    DialSy,     DosSy,
  630.                                  EchoSy,      ElseSy,     EndCaseSy,  EndIfSy,
  631.                                  EndWhileSy,  ExitSy,     FileSy,     GoToSy,
  632.                                  HangUpSy,
  633.                                  HostSy,      IfLocStrSy, InputSy,    KeySy,
  634.                                  KeySendSy,
  635.                                  LabelSy,     LogSy,      MessageSy,  MuteSy,
  636.                                  OtherSy,     ParamSy,    ReceiveSy,  RedialSy,
  637.                                  RepeatSy,    ResetSy,    RInputSy,   SDumpSy,
  638.                                  SendSy,      STextSy,    SuspendSy,  TextSy,
  639.                                  TranslateSy, UntilSy,    WaitSy,     WaitStrSy,  WhenSy,
  640.                                  WhileSy );
  641.  
  642.                                    (* Script conversion table       *)
  643.  
  644.    PibTerm_Command_Table_2 : ARRAY[0..No_Of_PibTerm_Commands_Minus_One]
  645.                              OF PibTerm_Command_Type
  646.                              = ( AddLFSy,     AreaCodeSy,  BreakSy,    CaptureSy,
  647.                                  CaseSy,      ClearSy,     DelaySy,    DialSy,
  648.                                  DosSy,       EchoSy,      EditSy,     ElseSy,
  649.                                  EndCaseSy,   EndIfSy,     EndWhileSy, ExitSy,
  650.                                  FastCSy,     FileSy,      GossipSy,   GoToSy,
  651.                                  HangUpSy,    HostSy,      IfConSy,    IfFoundSy,
  652.                                  IfLocStrSy,  IfRemStrSy,  InfoSy,     InputSy,
  653.                                  KeySendSy,
  654.                                  KeySy,       LabelSy,     LogSy,      MessageSy,
  655.                                  MuteSy,      OtherSy,     ParamSy,    QuitSy,
  656.                                  ReceiveSy,   ReDialSy,    RepeatSy,   ResetSy,
  657.                                  RInputSy,    SDumpSy,     SendSy,     STextSy,
  658.                                  SuspendSy,   TextSy,      TimersSy,   TranslateSy,
  659.                                  UntilSy,     ViewSy,      WaitSy,     WaitStrSy,
  660.                                  WhenSy,      WhileSy,
  661.                                  Bad_Command, Null_Command
  662.                                );
  663.  
  664. TYPE
  665.                                    (* Generic buffer type to hold script *)
  666.  
  667.    Script_Buffer_Type = ARRAY[1..1] OF BYTE;
  668.  
  669.                                    (* For pointing to start of script    *)
  670.  
  671.    Script_Buffer_Ptr  = ^Script_Buffer_Type;
  672.  
  673. VAR
  674.                                    (* WHEN text to wait for *)
  675.    Script_When_Text       : AnyStr;
  676.  
  677.                                    (* Response text for WHEN *)
  678.    Script_When_Reply_Text : AnyStr;
  679.  
  680.                                    (* Current input for WHEN checking *)
  681.    Script_When_Save       : AnyStr;
  682.  
  683.                                    (* WAITSTRING text to wait for *)
  684.    Script_Wait_Text       : AnyStr;
  685.  
  686.                                    (* Response text for WAITSTRING *)
  687.    Script_Wait_Reply_Text : AnyStr;
  688.  
  689.                                    (* Current input for WAITSTRING checking *)
  690.    Script_Wait_Save       : AnyStr;
  691.  
  692.                                    (* Time to wait for input string     *)
  693.    Script_Wait_Time       : INTEGER;
  694.  
  695.                                    (* Starting time of day for wait         *)
  696.    Script_Wait_Start      : REAL;
  697.  
  698.                                    (* Where to go to if wait string fails   *)
  699.    Script_Wait_Failure    : INTEGER;
  700.  
  701.                                    (* Wait string appeared                  *)
  702.    Script_Wait_Found      : BOOLEAN;
  703.  
  704.                                    (* Size of script buffer                 *)
  705.  
  706.    Script_Buffer_Size     : INTEGER;
  707.  
  708.                                    (* Pointer to compiled script text       *)
  709.  
  710.    Script_Buffer          : Script_Buffer_Ptr;
  711.  
  712.                                    (* Current position in script buffer     *)
  713.  
  714.    Script_Buffer_Pos      : INTEGER;
  715.  
  716.                                    (* Script integer values             *)
  717.  
  718.    Script_Integer_1       : INTEGER;
  719.    Script_Integer_2       : INTEGER;
  720.    Script_Integer_3       : INTEGER;
  721.  
  722.                                    (* Script text values                *)
  723.  
  724.    Script_String          : AnyStr;
  725.    Script_String_2        : AnyStr;
  726.  
  727.                                    (* Reply to Script INPUT prompt      *)
  728.    Script_Reply           : AnyStr;
  729.  
  730.                                    (* Reply was OK                      *)
  731.    Script_Reply_Found     : BOOLEAN;
  732.  
  733.                                    (* Script suspend time period        *)
  734.    Script_Suspend_Time    : REAL;
  735.  
  736.                                    (* Script suspend starting time      *)
  737.    Script_Suspend_Start   : REAL;
  738.  
  739.                                    (* Reply to Script RINPUT prompt     *)
  740.    Script_Remote_Reply    : AnyStr;
  741.  
  742.                                    (* Reply was OK                      *)
  743.    Script_Remote_Reply_OK : BOOLEAN;
  744.  
  745.  
  746. (*----------------------------------------------------------------------*)
  747. (*                 Global error return from DOS                         *)
  748. (*----------------------------------------------------------------------*)
  749.  
  750. VAR
  751.    Ierr : INTEGER                  (* DOS return error *);
  752.  
  753. (*----------------------------------------------------------------------*)
  754. (*                 Global screen positioning for autodownloads          *)
  755. (*----------------------------------------------------------------------*)
  756.  
  757. VAR
  758.    NewX  : INTEGER;
  759.    OldX  : INTEGER;
  760.    NewY  : INTEGER;
  761.    OldY  : INTEGER;
  762.  
  763. (*----------------------------------------------------------------------*)
  764. (*                           Session timers                             *)
  765. (*----------------------------------------------------------------------*)
  766.  
  767. VAR
  768.    Session_Start_Time: REAL        (* Starting time of entire session *);
  769.    Dialing_Start_Time: REAL        (* Starting time current dialing   *);
  770.  
  771. (*----------------------------------------------------------------------*)
  772. (*                    PibTerm Command Key Definitions                   *)
  773. (*----------------------------------------------------------------------*)
  774.  
  775. CONST
  776.    Alt_A = 30;      Alt_J = 36;      Alt_S = 31;
  777.    Alt_B = 48;      Alt_K = 37;      Alt_T = 20;
  778.    Alt_C = 46;      Alt_L = 38;      Alt_U = 22;
  779.    Alt_D = 32;      Alt_M = 50;      Alt_V = 47;
  780.    Alt_E = 18;      Alt_N = 49;      Alt_W = 17;
  781.    Alt_F = 33;      Alt_O = 24;      Alt_X = 45;
  782.    Alt_G = 34;      Alt_P = 25;      Alt_Y = 21;
  783.    Alt_H = 35;      Alt_Q = 16;      Alt_Z = 44;
  784.    Alt_I = 23;      Alt_R = 19;
  785.  
  786.    Shift_Tab = 15;
  787.  
  788.    F1        = 59;  Alt_F1   = 104;
  789.    F2        = 60;  Alt_F2   = 105;
  790.    F10       = 68;  Alt_F10  = 113;
  791.    Shift_F1  = 84;  Ctrl_F1  = 94;
  792.    Shift_F10 = 93;  Ctrl_F10 = 103;
  793.  
  794.    U_Arrow   = 72;  Alt_U_Arrow = 175;  Ctrl_U_Arrow = 160;
  795.    D_Arrow   = 80;  Alt_D_Arrow = 183;  Ctrl_D_Arrow = 164;
  796.    L_Arrow   = 75;  Alt_L_Arrow = 178;  Ctrl_L_Arrow = 115;
  797.    R_Arrow   = 77;  Alt_R_Arrow = 180;  Ctrl_R_Arrow = 116;
  798.  
  799.    Home      = 71;  Alt_Home    = 174;
  800.    End_Key   = 79;  Alt_End_Key = 182;  Ctrl_End_Key  = 117;
  801.    PgUp      = 73;  Alt_PgUp    = 176;  Ctrl_PgUp     = 132;
  802.    PgDn      = 81;  Alt_PgDn    = 184;  Ctrl_PgDn     = 118;
  803.    Ins_Key   = 82;  Alt_Ins_Key = 185;  Ctrl_Ins_Key  = 165;
  804.    Del_Key   = 83;  Alt_Del_Key = 186;  Ctrl_Del_Key  = 166;
  805.  
  806. (*----------------------------------------------------------------------*)
  807. (*                 --- Included procedures for PibTerm ---              *)
  808. (*----------------------------------------------------------------------*)
  809.  
  810. PROCEDURE Display_Character( Ch : CHAR );
  811.    FORWARD;
  812.  
  813. PROCEDURE Process_Command( VAR Ch       : CHAR;
  814.                                Use_Ch   : BOOLEAN;
  815.                            VAR Command  : PibTerm_Command_Type );
  816.    FORWARD;
  817.  
  818. PROCEDURE Execute_Command( VAR Command    : Pibterm_Command_Type;
  819.                            VAR Done       : BOOLEAN;
  820.                                Use_Script : BOOLEAN );
  821.    FORWARD;
  822.  
  823. (*$IINT24.PAS    *)
  824. (*$IMINMAX.PAS   *)
  825. (*$IYESNO.PAS    *)
  826. (*$IDUPL.PAS     *)
  827. (*$IUPPERCAS.PAS *)
  828. (*$ICOPYSTOA.PAS *)
  829. (*$IMAXBLOCK.PAS *)
  830. (*$IREADCTRL.PAS *)
  831. (*$IWRITCTRL.PAS *)
  832. (*$IPIBTIMER.PAS *)
  833. (*$IPIBASYNC.PAS *)
  834. (*$IPIBSCREN.PAS *)
  835. (*$ICLEARWIN.PAS *)
  836. (*$IPIBMENUS.PAS *)
  837. (*$IPIBDIR.PAS   *)
  838. (*$IPIBFHIO.PAS  *)
  839. (*$ITRIM.PAS     *)
  840. (*$ILTRIM.PAS    *)
  841. (*$ISENDMODE.PAS *)
  842. (*$IVIEWPMPT.PAS *)
  843. (*$IPIBCRC.PAS   *)
  844. (*$IHANGUP.PAS   *)
  845. (*$ISCANXFER.PAS *)
  846. (*$IERRORHAN.PAS *)
  847. (*$IWRITELNE.PAS *)
  848. (*$IINITOVLY.PAS *)
  849.  
  850. (*----------------------------------------------------------------------*)
  851. (*                 First overlay segment starts here.                   *)
  852. (*----------------------------------------------------------------------*)
  853.  
  854. (*$ISETTRTAB.PAS *)
  855. (*$ISETINPTK.PAS *)
  856. (*$IDISPHELP.PAS *)
  857. (*$IPIBDIALA.PAS *)
  858. (*$IPIBDIALB.PAS *)
  859. (*$IPIBFMANI.PAS *)
  860.  
  861. (*-------------------------- Upload procedures -------------------------*)
  862.  
  863. (*$IPIBUPLOD.PAS *)
  864. (*$IGETUPLOA.PAS *)
  865.                                    (* Xmodem family *)
  866. (*$IDOXMODU1.PAS *)
  867. (*$ISENDXMOD.PAS *)
  868. (*$ISENDMDM7.PAS *)
  869. (*$ISENDYMOD.PAS *)
  870. (*$IDOXMODU2.PAS *)
  871.                                    (* Ascii *)
  872. (*$ISENDASCI.PAS *)
  873.                                    (* Kermit *)
  874. (*$ISENDKER1.PAS *)
  875. (*$IKINIT.PAS    *)
  876. (*$IKERMCRC.PAS  *)
  877. (*$IKDISPLAY.PAS *)
  878. (*$IADJUSTFN.PAS *)
  879. (*$IKOPEN.PAS    *)
  880. (*$IKREC1.PAS    *)
  881. (*$IKSEND1.PAS   *)
  882. (*$ISENDKER2.PAS *)
  883. (*$IPIBUPLOB.PAS *)
  884.  
  885. (*-------------------------End Upload procedures -----------------------*)
  886.  
  887. (*------------------------ Download procedures -------------------------*)
  888.  
  889. (*$IPIBDWLOD.PAS *)
  890. (*$IGETDOWNL.PAS *)
  891.                                    (* Xmodem family *)
  892. (*$IDOXMODD1.PAS *)
  893. (*$IRECEIVEX.PAS *)
  894. (*$IRECEIVEM.PAS *)
  895. (*$IRECEIVEY.PAS *)
  896. (*$IDOXMODD2.PAS *)
  897.                                    (* Ascii *)
  898. (*$IRECEIVEA.PAS *)
  899.                                    (* Kermit *)
  900. (*$IRECEIVK1.PAS *)
  901. (*$IKINIT.PAS    *)
  902. (*$IKERMCRC.PAS  *)
  903. (*$IKDISPLAY.PAS *)
  904. (*$IKFIXFNAM.PAS *)
  905. (*$IADJUSTFN.PAS *)
  906. (*$IKOPEN.PAS    *)
  907. (*$IKREC1.PAS    *)
  908. (*$IKSEND1.PAS   *)
  909. (*$IRECEIVK2.PAS *)
  910. (*$IPIBDWLOC.PAS *)
  911.  
  912. (*-----------------------End Download procedures -----------------------*)
  913.  
  914. (*-----------------------CompuServe B Protocol--------------------------*)
  915.  
  916. (*$IDOCOMPUS.PAS *)
  917.  
  918. (*-----------------------End CompuServe B Protocol----------------------*)
  919.  
  920. (*$IEDITALIN.PAS *)
  921. (*$IGETAREAC.PAS *)
  922. (*$ISETPARMA.PAS *)
  923. (*$ISETPARMB.PAS *)
  924. (*$ISETPARMC.PAS *)
  925. (*$IREVIEWCA.PAS *)
  926. (*$IDISPLAYT.PAS *)
  927. (*$IDOSCDUMP.PAS *)
  928. (*$IGETCAPTU.PAS *)
  929. (*$IFASTCHNG.PAS *)
  930. (*$IDOSJUMP.PAS  *)
  931. (*$IPROCESSS.PAS *)
  932.  
  933. (*----------------------------------------------------------------------*)
  934. (*                 Dummy constant to break up overlay.                  *)
  935. (*----------------------------------------------------------------------*)
  936.  
  937. CONST
  938.    Dummy_Const = 99;
  939.  
  940. (*---------------------Primary character input/output handling----------*)
  941.  
  942. (*$ISENDFUNK.PAS *)
  943. (*$IDISPLAYC.PAS *)
  944. (*$ITOGGLEOP.PAS *)
  945. (*$IPROCESSC.PAS *)
  946. (*$IGETSCRIP.PAS *)
  947. (*$IEXECUTEC.PAS *)
  948.  
  949. (*----------------------------------------------------------------------*)
  950. (*                 Second overlay segment starts here.                  *)
  951. (*----------------------------------------------------------------------*)
  952.  
  953. (*---------------------Ansi/VT100 Terminal Emulator --------------------*)
  954.  
  955. (*$IPIBANSIA.PAS *)
  956. (*$IPIBANSIB.PAS *)
  957.  
  958. (*---------------------------VT52 Terminal Emulator --------------------*)
  959.  
  960. (*$IPIBVT52.PAS  *)
  961.  
  962. (*--------------------------------Host Mode ----------------------------*)
  963.  
  964. (*$IPIBHOSTA.PAS *)
  965. (*$IPIBHOSTB.PAS *)
  966. (*$IPIBHOSTC.PAS *)
  967.  
  968. (*--------------------------Dumb Terminal Mode -------------------------*)
  969.  
  970. (*$IPIBDUMBT.PAS *)
  971.  
  972. (*--------------------------Gossip Mode---------------------------------*)
  973.  
  974. (*$IPIBGOSSI.PAS *)
  975.  
  976. (*----------------------PibTerm Initialization--------------------------*)
  977.  
  978. (*$IINITTERM.PAS *)
  979.  
  980. (* ------------------------------------------------------------------------ *)
  981. (*                  PibTerm  --- Main Program                               *)
  982. (* ------------------------------------------------------------------------ *)
  983.  
  984. BEGIN (* PibTerm  *)
  985.                                    (* Get overlay directory *)
  986.    InitOvly;
  987.                                    (* Initialize PibTerm    *)
  988.    InitTerm;
  989.                                    (* Program finished flag *)
  990.    PibTerm_Done := FALSE;
  991.  
  992.    REPEAT
  993.                                    (* BEGIN Terminal Emulation *)
  994.       CASE Terminal_To_Emulate Of
  995.          VT52:     Emulate_VT52;
  996.          Dumb:     Emulate_Dumb_Terminal;
  997.          Ansi:     Emulate_Ansi( FALSE );
  998.          VT100:    Emulate_Ansi( TRUE );
  999.          Gossip:   Emulate_Gossip;
  1000.          HostMode: Emulate_Host;
  1001.       END (* CASE *);
  1002.  
  1003.    UNTIL ( PibTerm_Done );
  1004.                                    (* Close down serial port   *)
  1005.    Async_Close;
  1006.                                    (* Close capture file       *)
  1007.    IF Capture_On THEN
  1008.          (*$I-*)
  1009.       CLOSE( Capture_File );
  1010.          (*$I+*)
  1011.                                    (* Remove scrolling buffer  *)
  1012.    IF Review_Buffer <> NIL THEN
  1013.       FREEMEM( Review_Buffer , 81 * Max_Review_Length );
  1014.  
  1015.                                    (* Remove Interrupt 24 trap *)
  1016.    Int24OFF;
  1017.                                    (* Clear screen             *)
  1018.    ClrScr;
  1019.  
  1020. END   (* PibTerm  *).
  1021.